package com.ssy.invoicing.common.util;

import java.util.ArrayList;
import java.util.List;

/**
 * 分页数据对象
 * 
 * @author suoyao.shen
 */
public class PageParam {

    /** 默认每页显示的记录条数 */
    private static int DEFAULT_PAGE_SIZE = 20;
    /** 页码 */
    private int        page;
    /** 下页页码 */
    private int        nextpage;
    /** 上页页码 */
    private int        previouspage;
    /** 每页显示的记录条数 */
    private int        pageSize;
    /** 总记录条数 */
    private int        total;
    /** 页面的第一条记录的行号 */
    private int        firstRowNum;
    /** 页面的最后条记录的行号 */
    private int        lastRowNum;
    /** 总页数 */
    private int        pageTotal;

    public PageParam() {
        pageSize = DEFAULT_PAGE_SIZE;
    }

    /**
     * 初始化
     * 
     * @param newPage 页码
     */
    public PageParam(int newPage) {
        page = newPage;
        pageSize = DEFAULT_PAGE_SIZE;
        countPage();
    }

    /**
     * 初始化
     * 
     * @param newPage 页码
     * @param newTotal 总记录条数
     */
    public PageParam(int newPage, int newTotal) {
        page = newPage;
        pageSize = DEFAULT_PAGE_SIZE;
        total = newTotal;
        countPage();
    }

    /**
     * 初始化
     * 
     * @param newPage 页码
     * @param newPageSize 每页记录条数
     * @param newTotal 总记录条数
     */
    public PageParam(int newPage, int newPageSize, int newTotal) {
        page = newPage;
        pageSize = newPageSize;
        total = newTotal;
        countPage();
    }

    /**
     * @param newPage 新的页码
     * @param newTotal 总多少页
     */
    public void reset(int newPage, int newTotal) {
        page = newPage;
        total = newTotal;
        countPage();
    }

    /**
     * 根据页码、每页记录条数、总记录条数统计 总页面数、开始记录条数、结束记录条数
     */
    private void countPage() {
        if (pageSize == 0) {
            /**
             * 默认分页20条
             */
            pageSize = DEFAULT_PAGE_SIZE;
        }

        if (total <= 0) {
            total = 0;
        }

        pageTotal = total / pageSize;
        if (pageTotal * pageSize < total) {
            pageTotal = pageTotal + 1;
        }
        if (page > pageTotal) {
            page = pageTotal;
        }
        if (page <= 0) {
            /**
             * 默认第一页
             */
            if (pageTotal == 0) {
                page = 0;
            } else {
                page = 1;
            }
        }
        firstRowNum = (page - 1) * pageSize;
        if (firstRowNum < 0) {
            firstRowNum = 0;
        }
        lastRowNum = firstRowNum + pageSize;
        if (lastRowNum >= total) {
            lastRowNum = total;
        }
    }

    /**
     * @return the page
     */
    public int getPage() {
        return page;
    }

    /**
     * @return the pageSize
     */
    public int getpageSize() {
        return pageSize;
    }

    /**
     * @return the firstRowNum
     */
    public int getFirstRowNum() {
        return firstRowNum;
    }

    /**
     * @return the lastRowNum
     */
    public int getLastRowNum() {
        return lastRowNum;
    }

    /**
     * @return the pageTotal
     */
    public int getPageTotal() {
        return pageTotal;
    }

    /**
     * @return the total
     */
    public int getTotal() {
        return total;
    }

    /**
     * 返回取得的记录条数
     * 
     * @return int 记录条数
     */
    public int getLength() {
        return lastRowNum - firstRowNum;
    }

    /**
     * 判断是否有下一页
     * 
     * @return boolean true 有 false 没有
     */
    public boolean hasNextPage() {
        if (this.page < this.pageTotal) {
            return true;
        }
        return false;
    }

    /**
     * 判断是否有上一页
     * 
     * @return boolean true 有 false 没有
     */
    public boolean hasPreviousPage() {
        if (this.page > 1) {
            return true;
        }
        return false;
    }

    /**
     * 获取下页的页码
     * 
     * @return int 下页的页码
     */
    public int getNextPage() {
        if (this.page > this.pageTotal) {
            this.nextpage = this.pageTotal;
        } else {
            this.nextpage = this.page + 1;
        }
        return nextpage;
    }

    /**
     * 获取上页的页码
     * 
     * @return int 上页的页码
     */
    public int getPreviousPage() {
        if (this.page == 1) {
            this.previouspage = 1;
        } else {
            this.previouspage = this.page - 1;
        }
        if (this.previouspage < 0) {
            this.previouspage = 0;
        }
        return previouspage;
    }

    /**
     * 获取页码列表
     * 
     * @return List<Integer> 页码列表
     */
    public List<Integer> getPagenumList() {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 1; i <= this.pageTotal; i++) {
            list.add(i);
        }
        return list;
    }

    /**
     * @param page the page to set
     */
    public void setPage(int page) {
        this.page = page;
        firstRowNum = (page - 1) * pageSize;
        if (firstRowNum < 0) {
            firstRowNum = 0;
        }
    }

    /**
     * @param pageSize the pageSize to set
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    
    
}
